/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.bean;

import br.gov.fasepa.sgpf.entity.ContratoServidor;
import br.gov.fasepa.sgpf.entity.Servidor;
import br.gov.fasepa.sgpf.rn.ContratoServidorRN;
import br.gov.fasepa.sgpf.rn.ServidorRN;
import br.gov.fasepa.sgpf.util.JsfUtil;
import br.gov.fasepa.sgpf.util.SystemUtil;
import br.gov.fasepa.sgpf.util.Validator;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author marcosdj
 */
@ManagedBean
@ViewScoped
public class ContratoServidorBean extends ContratoServidorRN implements Serializable {

    private ContratoServidor cs = new ContratoServidor();
    private List<ContratoServidor> lista;
    private List<Servidor> servidores;
    private Validator validator = new Validator();
    private String titulo;
    private Servidor servidor = new Servidor();
    private SimpleDateFormat ano = new SimpleDateFormat("YYYY");
    private SimpleDateFormat mes = new SimpleDateFormat("MM");
    private SimpleDateFormat dia = new SimpleDateFormat("dd");
    private Calendar calendar = Calendar.getInstance();
    private boolean habilitaCampo = false;
    private boolean habilitaImputText = false;
    private Date dataInicial = new Date();
    private ServidorRN srn = new ServidorRN();
    private String mat;
    private String vinc;

    public ContratoServidorBean() {
        this.titulo = "CADASTRAR CONTRATO";
        if (JsfUtil.getSession().getAttribute("UC") != null) {
            System.out.println("chegou aqui");
            Object[] array = (Object[]) JsfUtil.getSession().getAttribute("UC");
            if (array[1] instanceof ContratoServidor) {
                this.cs = (ContratoServidor) array[1];
                this.servidor = cs.getServidor();
                this.titulo = "ALTERAR CONTRATO";
                this.habilitaCampo = true;
            }
        }

    }

    public String irCadContratoServidor() {
        return "/sistema/contratoServidor/cadastroContrato.xhtml?faces-redirect=true";
    }

    public String irLista() {
        validator.verificaSessao();
        return "/sistema/contratoServidor/lista.xhtml?faces-redirect=true";
    }

    public String alterar() {
        return "/sistema/contratoServidor/cadastroContrato.xhtml?faces-redirect=true";
    }

    public void addContrato() throws IOException {
        if (verificaVigenciaContrato()) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("cadastroContrato.xhtml");
        } else {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "nocontract");
        }
    }

    public void putInSession(ContratoServidor contrato) throws Exception {
        System.out.println("acionou put in session");
        SystemUtil.updateUseCase(contrato, ContratoServidor.class);
    }

    public void verificaCamposDialog() {
        if (validarCampos()) {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "salvar");
        } else {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "nok");
        }
    }

    public void salvar() {
        if (JsfUtil.getSession().getAttribute("UC") == null) {
            servidor.getContratoServidorList().add(cs);
            srn.edit(servidor);
        } else {
            edit(cs);
        }
        cs = null;
        RequestContext.getCurrentInstance().addCallbackParam("flag", "ok");
        validator.verificaSessao();
    }

    public void cancelar() throws IOException {
        validator.verificaSessao();
        cs = new ContratoServidor();
        this.titulo = "CADASTRAR CONTRATO";
        this.servidor = null;
        this.dataInicial = null;
        this.habilitaCampo = false;
        this.mat = null;
        this.vinc = null;
        this.habilitaImputText = false;
    }

    public boolean validarCampos() {
        boolean resposta = true;
        cs.setServidor(servidor);
        cs.setDataInicio(dataInicial);
        cs.setMatricula(mat);
        cs.setVinculo(vinc);
        if (JsfUtil.getSession().getAttribute("UC") == null) {
            if (cs.getServidor() != null && !verificaVigenciaContrato()) {
                FacesContext.getCurrentInstance().
                        addMessage("msgServidor",
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Servidor já possui um contrato ativo", ""));
                resposta = false;
            }
        }
        if (dataInicial == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgData",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Data inicial é obrigatório", ""));
            resposta = false;
        }
        if (cs.getServidor().getTipoDeCargo().getId() == 3 && cs.getDataFim() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgDataFim",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Data final é obrigatório", ""));
            resposta = false;
        }
        if (cs.getMatricula().trim().equals("") || cs.getVinculo().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgMatricula",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo " + alternaMsgMatricula() + " é obrigatório", ""));
            resposta = false;
        } else if (cs.getMatricula().trim().equals("")) {
            ContratoServidor cstemp = obtain(cs.getMatricula());
            if (cstemp != null) {
                FacesContext.getCurrentInstance().
                        addMessage("msgMatricula",
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Servidor já está cadastrado no sistema ", ""));
                resposta = false;
            }
        }

        if (cs.getNumeroDoe() == null || cs.getNumeroDoe().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgDoe",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Número do DOE é obrigatório", ""));
            resposta = false;
        }
        return resposta;
    }

    public boolean habilitaDataFim() {
        boolean resposta = true;
        if (resposta) {

        }
        return resposta;
    }

    public String alternaMsgMatricula() {
        String resposta = null;
        if (cs.getMatricula().trim().equals("") && cs.getVinculo().trim().equals("")) {
            resposta = "Matrícula";
        } else if (cs.getMatricula().trim().equals("") && !cs.getVinculo().trim().equals("")) {
            resposta = "Matrícula";
        } else {
            resposta = "Vinculo";
        }
        return resposta;
    }

    public boolean verificaVigenciaContrato() {
        boolean resposta = true;
        ContratoServidor ctemp;
        int anotemp;
        if (cs.getServidor().getContratoServidorList() != null) {
            if (cs.getServidor().getContratoServidorList().size() >= 1) {
                ctemp = cs.getServidor().getContratoServidorList().get(0);
                if (cs.getServidor().getTipoDeCargo().getId() != 3 && ctemp.getStatus().trim().equals("ativo")) {
                    resposta = false;
                } else {
                    for (ContratoServidor contrs : cs.getServidor().getContratoServidorList()) {
                        if (contrs.getStatus().trim().equals("ativo")) {
                            anotemp = Integer.parseInt(ano.format(contrs.getDataInicio()));
                            if (anotemp == calendar.get(Calendar.YEAR)) {
                                resposta = false;
                            }
                        }
                    }
                }
            }
        }
        return resposta;
    }

    public ContratoServidor getCs() {
        return cs;
    }

    public void setCs(ContratoServidor cs) {
        this.cs = cs;
    }

    public List<ContratoServidor> getLista() {
        if (lista == null) {
            lista = obterAtivos();
        }
        return lista;
    }

    public List<Servidor> getServidores() {
        List<Servidor> stemp = new ServidorRN().obtainAll(Servidor.class);
        if (stemp != null) {
            servidores = stemp;
        }
        return servidores;
    }

    public void setServidores(List<Servidor> servidores) {
        this.servidores = servidores;
    }

    public void setLista(List<ContratoServidor> lista) {
        this.lista = lista;
    }

    public Validator getValidator() {
        return validator;
    }

    public void setValidator(Validator validator) {
        this.validator = validator;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Servidor getServidor() {
        return servidor;
    }

    public void setServidor(Servidor servidor) {
        this.servidor = servidor;
    }

    public boolean isHabilitaCampo() {
        return habilitaCampo;
    }

    public void setHabilitaCampo(boolean habilitaCampo) {
        this.habilitaCampo = habilitaCampo;
    }

    public Date getDataInicial() {
        if (servidor != null) {
            dataInicial = servidor.getDataAdmissao();
        }
        return dataInicial;
    }

    public void setDataInicial(Date dataInicial) {
        this.dataInicial = dataInicial;
    }

    public boolean isHabilitaImputText() {
        return habilitaImputText;
    }

    public void setHabilitaImputText(boolean habilitaImputText) {
        this.habilitaImputText = habilitaImputText;
    }

    public String getMat() {
        if (servidor != null) {
            if (servidor.getContratoServidorList()!= null && servidor.getContratoServidorList().size() > 0) {
                mat = servidor.getContratoServidorList().get(0).getMatricula();
                this.habilitaImputText = true;
            }else{
                mat = null;
                this.habilitaImputText = false;
            }
        }
        return mat;
    }

    public void setMat(String mat) {
        this.mat = mat;
    }

    public String getVinc() {
        if (servidor != null) {
            if (servidor.getContratoServidorList()!= null && servidor.getContratoServidorList().size() > 0) {
                vinc = servidor.getContratoServidorList().get(0).getVinculo();
                this.habilitaImputText = true;
            }else{
                vinc = null;
                this.habilitaImputText = false;
            }
        }

        return vinc;
    }

    public void setVinc(String vinc) {
        this.vinc = vinc;
    }

}
